package xyz.hubery.service;

import xyz.hubery.domain.Account;
import com.baomidou.mybatisplus.extension.service.IService;
import xyz.hubery.domain.ExchangeTrade;
import xyz.hubery.dto.UpdateAccountDTO;
import xyz.hubery.vo.SymbolAssetVo;
import xyz.hubery.vo.UserTotalAccountVo;

import java.math.BigDecimal;
import java.util.List;

public interface AccountService extends IService<Account>{

    /**
     * 根据用户ID和币种名称获取账户信息
     * @param userId 用户ID
     * @param coinName 币种名称
     * @return
     */
    Account getUserAccountByCoinName(Long userId, String coinName);


    /**
     * 暂时锁定用户的资产
     * @param userId
     * 用户的 id
     * @param coinId
     * 币种的 id
     * @param mum
     * 锁定的金额
     * @param type
     * 资金流水的类型
     * @param orderId
     * 订单的 Id
     * @param fee
     * 本次操作的手续费
     */
    boolean lockUserAmount(Long userId, Long coinId, BigDecimal mum, String type,Long orderId, BigDecimal fee);

    /**
     * 修改账户余额
     * @param adminId 操作员ID
     * @param userId 用户ID
     * @param coinName 币种名称
     * @param orderId 订单ID
     * @param mum 变动金额
     * @param fee 手续费
     * @param type 业务类型
     * @param remark 流水状态
     * @return
     */
    boolean transferAmount(Long adminId, Long userId, String coinName,Long orderId,BigDecimal mum, BigDecimal fee,String type,String remark);


    /**
     * 提现时扣减余额
     * @param adminId
     * @param userId
     * @param coinId
     * @param orderId
     * @param mum
     * @param fee
     * @return
     */
    boolean subAmount(Long adminId, Long userId, Long coinId,Long orderId, BigDecimal mum, BigDecimal fee) ;

    /**
     * 计算用户的总资产
     * @param userId 用户ID
     * @return
     */
    UserTotalAccountVo getUserTotalAccount(Long userId);

    /**
     * 查询用户交易对资产
     * @param userId
     * @param symbol 交易对标识
     * @return
     */
    SymbolAssetVo getUserAssetBySymbol(Long userId, String symbol);

    /**
     * 解冻资金
     * @param userId 用户id
     * @param coinId 币种id
     * @param freeze 解冻资金
     */
    boolean unFreeze(Long userId, Long coinId, BigDecimal freeze);


    /**
     * 根据成交记录更新账户余额信息
     */
    boolean transferAmount(UpdateAccountDTO accountDTO);

    /**
     * 根据用户id和币种id查询账户
     * @param userId
     * @param coinId
     * @return
     */
    Account getUserAccountByCoinId(Long userId, Long coinId);
}
